from django.shortcuts import render

# Create your views here.
"""
视图
所谓的视图 其实就是Python函数
视图函数有两个要求：
    1.视图函数的第一个参数就是接收请求。这个请求就是HttpRequest的类对象
    2.必须返回一个响应
"""

# request
from django.http import HttpRequest
from django.http import HttpResponse
from book.models import BookInfo


def index(request):
    books = BookInfo.objects.all()
    print(books)

    # render 渲染
    # 模拟数据查询

    return HttpResponse("index")


# =================== 增加数据 =================================
from book.models import BookInfo

book = BookInfo(
    name="django",
    pub_date="2000-1-1",
    readcount="10"
)
# 必须调用 对象的save方法才能将数据保存到数据库中
book.save()

# 方式2
# objects --相当于一个代理，实现增删改查
#
BookInfo.objects.create(
    name="django1",
    pub_date="2000-1-2",
    readcount="13"
)

# ===================== 修改数据 ===============================
book = BookInfo.objects.get(id=6)
book.name = "运维开发"
book.save()  # 调用对象的save方法

# 方式2

BookInfo.objects.filter(id=6).update(name="爬虫入门", commentcount=666)

# ===================== 删除数据 ===============================
book = BookInfo.objects.get(id=1)

# 删除分两种，物理删除（删除数据）和逻辑删除（修改标记位 例如 is_delete=Fales）
book.delete()

# 方式2
BookInfo.objects.get(id=2).delete()

# ===================== 查询数据 ===============================
# get获取一个对象，如果对象不存在会抛出DoesNotExist异常
book = BookInfo.objects.get(id=6)

# all查询多个结果
books = BookInfo.objects.all()

from book.models import PearsonInfo

people = PearsonInfo.objects.all()

# count 查询结果数量
BookInfo.objects.all().count()
PearsonInfo.objects.all().count()

# ===================== 过滤查询 ===============================
# 模型类名.objects.filter(属性名_运算符=值）        获取n个结果
# 模型类名.objects.exclude(属性名_运算符=值）       获取n个结果
# 模型类名.objects.get(属性名_运算符=值）           获取一个结果或者异常

# 查询编号为1的图书
book = BookInfo.objects.get(id=4)  # 简写形式
book = BookInfo.objects.get(id__exact=1)  # 完整形式

BookInfo.objects.get(pk=1)  # pk primary key 主键
BookInfo.objects.filter(pk=1)  # get返回一个值，filter返回列表

# 查询书名包含'湖'的图书
book = BookInfo.objects.filter(name__contains="湖")

# 查询书名以'部'结尾的图书
book = BookInfo.objects.filter(name__endswith="部")

# 查询书名为空的图书
BookInfo.objects.filter(name__isnull=True)

# 查询编号为1或3或5的图书
BookInfo.objects.filter(id__in=[5, 7, 8])

# 查询编号大于3的图书

# 大于 great than gt
# 大于等于 gte equal e
# 小于 less than lt
# 小于等于 less than equal lte
# 不等于 采用exclude方法

BookInfo.objects.filter(id__gt=3)

# 查询编号不等于3的图书
BookInfo.objects.exclude(id=3)

# 查询1980年发表的图书
BookInfo.objects.filter(pub_date__year=1980)

# 查询1990年1月1日后发表的图书
BookInfo.objects.filter(pub_date__gt="1990-1-1")

########################################################

from django.db.models import F

# 使用：2个属性的比较
# 语法形式:以filter为例 模型类名.objects.filter(属性名__运算符=F('第二个属性名'))
BookInfo.objects.filter(readcount__gt=F("commentcount"))

#######################################################
# 并且查询
# 查询阅读量大于20，并且编号小于3的图书。
BookInfo.objects.filter(readcount__gt=20, id__lt=6)

# 或者查询
from django.db.models import Q

# 或者语法形式: 模型类名.objects.filter(Q(属性名__运算符=值)|Q(属性名__运算符=值))
# 并且语法形式: 模型类名.objects.filter(Q(属性名__运算符=值)&Q(属性名__运算符=值))
# 非语法形式: 模型类名.objects.filter(～Q(属性名__运算符=值))
BookInfo.objects.filter(Q(readcount__gt=20) | Q(id__gt=6))
BookInfo.objects.filter(~Q(id__gt=6))

################### 聚合函数 ###########################
from django.db.models import Sum, Max, Min, Avg, Count

BookInfo.objects.aggregate(Sum("readcount"))

#################### 排序 ##############################
BookInfo.objects.all().order_by("readcount")

##################### 级联操作 #########################
# 查询书籍为1的所有人物信息
book = BookInfo.objects.get(id=3)
book.pearsoninfo_set.all()

# 查询人物为1的书籍信息
person = PearsonInfo.objects.get(id=10)
person.book.name

##################### 关联过滤查询 ########################
# 查询图书，要求图书人物为"郭靖"
BookInfo.objects.filter(pearsoninfo__name__exact = "令狐冲")
# 查询图书，要求图书中人物的描述包含"八"
BookInfo.objects.filter(pearsoninfo__description__contains = "六")

# 查询书名为“天龙八部”的所有人物
PearsonInfo.objects.filter(book__name__exact = "天龙八部")
# 查询图书阅读量大于30的所有人物qd